home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / new_file / falcon / dsppaula / dsppaula.lzh / dsppauv2.asm < prev    next >
Assembly Source File  |  1993-11-01  |  11KB  |  339 lines

  1. ;****************************************************************************
  2. ;*******************    D S P - P A U L A - SSI-Version   *******************
  3. ;****************  coded by Chris of AURA of the INEPENDENT  ****************
  4. ;****************  thanx to Bitmaster and Questor of Inter   ****************
  5. ;************************ for the great information *************************
  6. ;****************************************************************************
  7. ;***************   first code  : 14.04.93                      ***************
  8. ;***************   last changes: 12.05.93                      ***************
  9. ;****************************************************************************
  10.  
  11. ;wichtige Hinweise:
  12. ;die DSP-Paula darf nur komplett im Y-Ram betrieben werden.
  13. ;Hostcommand $13 wird durch die DSP-Paula belegt-
  14. ;es werden insgesamt 2 Stackeinträge benötigt-
  15.  
  16. dsp_paula_start:    equ $4000-7100    ;Startadr. des DSP-Paulacodes
  17.  
  18. v_hz:        equ    50                    ;VBL-Frequenz
  19. sam_bufcnt:    equ    33300/v_hz            ;max. Bytedurchsatzpufferlänge pro VBL
  20.                                     ;Erfahrungswert
  21.  
  22. ;*********************************************************************
  23. ;r7: Stereopufferadresse
  24.         org        P:$10                ;SSI-Transmit
  25.         movep    Y:(r7)+,X:<<$ffef    ;1 Monosamplewort rüber
  26.         org        P:$12                ;SSI-Transmit with Exception
  27.         movep    Y:(r7)+,X:<<$ffef    ;1 Monosamplewort rüber
  28. ;*********************************************************************
  29. ;Vektor für Hostcommand 1 setzen
  30.         org        P:$26                ;Hostcommandvektor 1
  31.         jsr        dsp_paula
  32. ;*********************************************************************        
  33.         org        P:dsp_paula_start
  34.  
  35. install_paula:
  36.         clr        a
  37.         move    a1,P:voice1_par            ;Stimme 1-Parameter setzen
  38.         move    a1,P:voice1_par+4        ;Restoffset
  39.         move    a1,P:voice1_par+5        ;auf 0,0
  40.         move    a1,P:voice2_par            ;Stimme 2-Parameter setzen
  41.         move    a1,P:voice2_par+4        ;Restoffset
  42.         move    a1,P:voice2_par+5        ;auf 0,0
  43.         move    a1,P:voice3_par            ;Stimme 3-Parameter setzen
  44.         move    a1,P:voice3_par+4        ;Restoffset
  45.         move    a1,P:voice3_par+5        ;auf 0,0
  46.         move    a1,P:voice4_par            ;Stimme 4-Parameter setzen
  47.         move    a1,P:voice4_par+4        ;Restoffset
  48.         move    a1,P:voice4_par+5        ;auf 0,0
  49.  
  50.         move    #sam_clc,r1
  51.         jclr    #0,X:<<$ffe9,*
  52.         movep    X:<<$ffeb,Y:(r1)        ;Samplebyteanzahl holen
  53.  
  54.         move    #stereo1_trk,r0            ;Stereopuffer
  55.         rep        #1000*2*2
  56.         move    a,Y:(r0)+                ;löschen
  57.  
  58.         bset    #13,X:<<$ffff
  59.         bset    #12,X:<<$ffff            ;SSI auf Prio 3
  60.         movep    #$01f8,X:<<$ffe1        ;PCC: alle SSI-Ports auf seriell
  61.         movep    #$0000,X:<<$ffe3        ;PCDDR setzen: alles 'in'
  62.         movep    #$4100,X:<<$ffec        ;CRA setzen: 16 Bit/ 2 Worte 
  63.                                         ;pro Frame
  64.         movep    #$4a00,X:<<$ffed        ;CRB setzen: Transmitter-IRQ an
  65.                                         ;Network/syncron....
  66.         move    #$ffff,m7
  67. infinity:
  68.         jmp        infinity
  69.  
  70. ;*********************************************************************
  71. dsp_paula:
  72. ;vorberechnete Stereodaten an den Host
  73.         andi    #$fc,mr
  74.         ori        #$2,mr                    ;auf Prio 2 gehen
  75.         bclr    #3,X:<<$ffe8            ;HF2 löschen
  76.  
  77.         move    r0,P:save_reg
  78.         move    #save_reg+1,r0
  79.         move    m0,P:save_reg+23
  80.         movec    #$ffff,m0
  81.         nop
  82.         move    r1,Y:(r0)+                ;Adressregister
  83.         move    r2,Y:(r0)+
  84.         move    r3,Y:(r0)+
  85.         move    r4,Y:(r0)+
  86.         move    n0,Y:(r0)+
  87.         move    n1,Y:(r0)+                ;Offsetregister
  88.         move    n2,Y:(r0)+
  89.         move    n4,Y:(r0)+
  90.         move    m1,Y:(r0)+                ;Modifierreg.
  91.         move    m2,Y:(r0)+
  92.         move    m3,Y:(r0)+
  93.         move    m4,Y:(r0)+
  94.         move    x0,Y:(r0)+                ;Arithmetikregister
  95.         move    x1,Y:(r0)+
  96.         move    y0,Y:(r0)+
  97.         move    y1,Y:(r0)+
  98.         move    a2,Y:(r0)+
  99.         move    a1,Y:(r0)+
  100.         move    a0,Y:(r0)+
  101.         move    b2,Y:(r0)+
  102.         move    b1,Y:(r0)+
  103.         move    b0,Y:(r0)+    
  104.         movec    m0,m1
  105.         movec    m0,m2                    ;setzen
  106.         movec    m0,m3
  107.         movec    m0,m4
  108.  
  109.  
  110.         bset    #12,X:<<$ffed            ;SSI-IRQ starten
  111.  
  112.                                         ;auf Frame-Sync warten
  113.         jclr    #2,X:<<$ffee,*            ;auf abst. Flanke warten
  114.         jset    #2,X:<<$ffee,*            ;auf aufst. Flanke warten
  115.  
  116.         nop                                ;keine Ahnung-NOPs
  117.         nop
  118.         nop
  119.                 
  120.         move    P:stereo_puf_adr,r7        ;1. Pufferadr. holen
  121.         move    P:stereo_puf_adr+1,r4    ;2. Pufferadr. holen
  122.         move    r7,P:stereo_puf_adr+1    ;vertauschen
  123.         move    r4,P:stereo_puf_adr        ;r7 >> akt. Abspieladresse
  124.  
  125.         bset    #3,X:<<$ffe8            ;HF2 setzen >> DSP-Paula am Werk
  126.                 
  127. ;Samples der 4 Stimmen holen
  128.         move    #voice1_par,r0
  129.         jsr        get_sample_data            ;Sampledaten holen
  130.  
  131.         move    #voice2_par,r0            ;2. Stimme
  132.         jsr        get_sample_data            ;Sampledaten holen
  133.  
  134.         move    #voice3_par,r0            ;3. Stimme
  135.         jsr        get_sample_data            ;Sampledaten holen
  136.  
  137.         move    #voice4_par,r0            ;4. Stimme
  138.         jsr        get_sample_data            ;Sampledaten holen
  139.  
  140. ;Stimmen mischen
  141. ;r4: akt. Berechnungspufferadr.
  142.         move    #<$2,n1                    ;Monooffset
  143.         move    #voice1_par,r0            ;Puffer der 1. Stimme
  144.         move    r4,r1
  145.         jsr        calc_one_voice            ;berechnen
  146.  
  147.         move    #voice4_par,r0            ;Puffer der 4. Stimme
  148.         move    r4,r1
  149.         jsr        mix_one_voice            ;berechnen und dazumischen
  150.  
  151.         move    #voice2_par,r0            ;Puffer der 2. Stimme
  152.         lua        (r4)+,r1                
  153.         jsr        calc_one_voice            ;berechnen
  154.  
  155.         move    #voice3_par,r0            ;Puffer der 3. Stimme
  156.         lua        (r4)+,r1                
  157.         jsr        mix_one_voice            ;berechnen und dazumischen
  158.  
  159.         move    P:sam_clc,x0            ;Sampleanzahl holen
  160.         move    r4,a
  161.         add        x0,a
  162.         add        x0,a
  163.         move    a,r4                    ;r4: Samplepufferende
  164.         move    #>1,n4
  165.         do        #8,knacken_kill
  166.         move    Y:(r4)+,x0              ;8 Worte kopieren
  167.         move    x0,Y:(r4+n4)            ;dadurch Knacken verhindern
  168. knacken_kill:        
  169.  
  170.         move    #save_reg+1,r0
  171.         nop
  172.         move    Y:(r0)+,r1                ;Adressregister
  173.         move    Y:(r0)+,r2
  174.         move    Y:(r0)+,r3
  175.         move    Y:(r0)+,r4
  176.         move    Y:(r0)+,n0
  177.         move    Y:(r0)+,n1                ;Offsetregister
  178.         move    Y:(r0)+,n2
  179.         move    Y:(r0)+,n4
  180.         move    Y:(r0)+,m1                ;Modifierreg.
  181.         move    Y:(r0)+,m2
  182.         move    Y:(r0)+,m3
  183.         move    Y:(r0)+,m4
  184.         move    Y:(r0)+,x0                ;Arithmetikregister
  185.         move    Y:(r0)+,x1
  186.         move    Y:(r0)+,y0
  187.         move    Y:(r0)+,y1
  188.         move    Y:(r0)+,a2
  189.         move    Y:(r0)+,a1
  190.         move    Y:(r0)+,a0
  191.         move    Y:(r0)+,b2
  192.         move    Y:(r0)+,b1
  193.         move    Y:(r0)+,b0    
  194.         move    Y:(r0)+,m0                ;Modifierreg.
  195.         move    P:save_reg,r0
  196.  
  197.         bclr    #3,X:<<$ffe8            ;HF2 löschen >> DSP nun frei
  198.         rti
  199. ;***************************************
  200. ;Berechnet 1 Spur ohne mischen
  201. ;r0: Parameteradr. des Samples
  202. ;r1: Stereopufferadr.
  203. calc_one_voice:
  204.         lua        (r0)+,r2                ;1 Eintrag überspringen
  205.         nop                                ;Pipeline-NOP
  206.         move    Y:(r2)+,y1                ;Lautstärke holen
  207.         move    Y:(r2)+,x1                ;Sample-Vorkommaoffset holen
  208.         move    Y:(r2)+,x0                ;Sample-Nachkommaoffset holen
  209.         move    r2,r3
  210.         move    Y:(r2)+,b                ;Restvorkomma holen
  211.         move    Y:(r2)+,b0                ;Restnachkomma holen
  212.         move    r2,y0                    ;Sampleadr. 
  213.         add        y0,b    r2,n2            ;+,Sampleadr. retten
  214.         move    b1,r2                    ;Startadr. im Samplepuffer
  215.         move    P:sam_clc,y0            ;Anzahl holen
  216.         
  217.         do        y0,calc_one_voice_do
  218.         add        x,b        Y:(r2),y0        ;Sampleoffset addieren
  219.                                         ;Samplebyte holen
  220.         mpy        y1,y0,a        b1,r2        ;*Lautstärke,neue Sampleadr. holen    
  221.         move    a0,Y:(r1)+n1            ;und speichern
  222. calc_one_voice_do:
  223.  
  224.         move    n2,x0                    ;Samplestart holen
  225.         sub        x0,b                    ;- akt. Sampleposition
  226.         move    b1,x0
  227.         bclr    #0,x0                    ;auf Wort abrunden
  228.         move    x0,Y:(r0)                ;und speichern
  229.         sub        x0,b                    ;- >> Restoffset errechnen
  230.         move    b1,Y:(r3)+                ;und für nächsten VBL speichern        
  231.         move    b0,Y:(r3)
  232.         rts
  233. ;***************************************
  234. ;Berechnet 1 Spur mit mischen
  235. ;r0: Pufferadr. des Samples
  236. ;r1: Stereopufferadr.
  237. mix_one_voice:
  238.         lua        (r0)+,r2                ;1 Eintrag überspringen
  239.         nop                                ;Pipeline-NOP
  240.         move    Y:(r2)+,y1                ;Lautstärke holen
  241.         move    Y:(r2)+,x1                ;Sample-Vorkommaoffset holen
  242.         move    Y:(r2)+,x0                ;Sample-Nachkommaoffset holen
  243.         move    r2,r3
  244.         move    Y:(r2)+,b                ;Restvorkomma holen
  245.         move    Y:(r2)+,b0                ;Restnachkomma holen
  246.         move    r2,y0                    ;Sampleadr. 
  247.         add        y0,b    r2,n2            ;+,Sampleadr. retten
  248.         move    b1,r2                    ;Startadr. im Samplepuffer
  249.          move    P:sam_clc,y0            ;Anzahl
  250.         clr        a                        ;a löschen
  251.  
  252.         do        y0,mix_one_voice_do
  253.         add        x,b        Y:(r2),y0        ;Sampleoffset addieren
  254.                                         ;Samplebyte holen
  255.         move    Y:(r1),a0                ;zuvor berechn. Samplewert holen
  256.         mac        y1,y0,a        b1,r2        ;*Lautstärke,neue Sampleadr. holen    
  257.         clr        a    a0,Y:(r1)+n1        ;und speichern
  258. mix_one_voice_do:
  259.  
  260.         move    n2,x0                    ;Samplestart holen
  261.         sub        x0,b                    ;- akt. Sampleposition
  262.         move    b1,x0
  263.         bclr    #0,x0                    ;auf Wort abrunden
  264.         move    x0,Y:(r0)                ;und speichern
  265.         sub        x0,b                    ;- >> Restoffset errechnen
  266.         move    b1,Y:(r3)+                ;und für nächsten VBL speichern        
  267.         move    b0,Y:(r3)
  268.         rts
  269. ;***************************************
  270. ;Läd Lautstärke und Sample in den Y-Speicher
  271. ;Sampledaten von 0 bis 255
  272. ;r0: Parameteradr. des Sampels
  273. get_sample_data:
  274.         jclr    #1,X:<<$ffe9,*
  275.         movep    Y:(r0)+,X:<<$ffeb            ;Tatsächlich bearb. Bytes senden
  276.         jclr    #0,X:<<$ffe9,*
  277.         movep    X:<<$ffeb,Y:(r0)+            ;Lautstärke holen
  278.         jclr    #0,X:<<$ffe9,*
  279.         movep    X:<<$ffeb,Y:(r0)+            ;Schrittweite Vorkomma holen
  280.         jclr    #0,X:<<$ffe9,*
  281.         movep    X:<<$ffeb,Y:(r0)+            ;Schrittweite Nachkomma holen
  282.  
  283.         move    #<2,n0
  284.         nop                                    ;Pipeline-NOP
  285.         lua        (r0)+n0,r0                    ;Restwert überspringen
  286.  
  287.         jclr    #0,X:<<$ffe9,*
  288.         movep    X:<<$ffeb,y0                ;Anzahl der zu übertr. Worte holen
  289.  
  290.         move    #>$10000/2,x0                ;Verschiebungswert durch mpy
  291.         move    #>128,x1                    ;Subr.Wert
  292.         move    #>$0000FF,y1                ;Ausmaskierungswert
  293.         do        y0,load_sample
  294.         jclr    #0,X:<<$ffe9,*
  295.         movep    X:<<$ffeb,y0                ;2 8-bit-Samplewerte holen
  296. ;wichtig: oberstes Byte mu₧ null sein
  297.         mpy        x0,y0,a                        ;oberes Byte nach a1 schieben
  298.         sub        x1,a                        ;-128
  299.         move    y0,a    a,Y:(r0)+            ;und speichern
  300.         and        y1,a                        ;unteres Byte holen
  301.         sub        x1,a                        ;-128
  302.         move    a,Y:(r0)+                    ;unteres Byte speichern        
  303. load_sample:
  304.         rts
  305. ;***************************************
  306. save_reg:    ds    25                            ;Platz für die Register
  307. sam_clc:    ds    1                            ;Anzahl der Samplebytes
  308. stereo_puf_adr:
  309.             dc    stereo1_trk,stereo2_trk
  310. ;Parameter und Puffer für die Samples
  311. voice1_par: ds    1                            ;tatsächlich abgearb. Bytes
  312.                                             ;auf Wortgrenze abgerundet
  313.                                             ;mu₧ dem Host vor neuer Sampleübergabe
  314.                                             ;übermittelt werden
  315. ;Lautstärke als Fraktionalwert (zw. 0 und 1)
  316.             ds    1                            ;Lautstärke als Kommawert
  317.                                             ;vom Host pro VBL übermittelt
  318. ;Schrittweite innerhalb des Samples
  319.             ds    2                            ;Sampleoffset (48 Bit)
  320. ;Da der Samplepuffer nie vollständig abgearbeitet wird, bleibt ein Rest
  321. ;übrig der das nächste Mal zur voice_buf-Adr. dazuaddiert werden mu₧.
  322.             ds    2                            ;Restoffset von der letzten Berechnung
  323. voice1_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  324.  
  325. voice2_par: ds    6
  326. voice2_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  327. voice3_par: ds    6
  328. voice3_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  329. voice4_par: ds    6
  330. voice4_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  331.  
  332.  
  333. ;****************************************
  334. ;Stereopuffer, 2 Spuren gemischt
  335. stereo1_trk:    ds    1000*2                    ;Stereopuffer 1
  336. stereo2_trk:    ds    1000*2                    ;Stereopuffer 2
  337. ;****************************************
  338. end:
  339.         end        dsp_paula_start            ;Installierung starten